"""
测试Log_Utils的并发日志记录功能
"""

import os
import tempfile
import time
import threading
from com.tools.Log_Utils import LogUtils


def test_concurrent_logging():
    """
    测试并发写入日志的情况
    """
    temp_dir = tempfile.mkdtemp()
    print(f"使用临时目录进行并发测试: {temp_dir}")
    
    try:
        log_file = os.path.join(temp_dir, "concurrent.log")
        
        # 创建共享的日志记录器
        logger = LogUtils("concurrent_logger").add_file_handler(log_file).add_console_handler()
        
        def log_messages(thread_id):
            """在不同线程中记录日志"""
            for i in range(5):
                logger.info(f"线程 {thread_id} 的第 {i+1} 条消息")
                time.sleep(0.01)  # 模拟一些处理时间
        
        # 创建并启动多个线程
        threads = []
        for i in range(3):
            thread = threading.Thread(target=log_messages, args=(i+1,))
            threads.append(thread)
            thread.start()
        
        # 等待所有线程完成
        for thread in threads:
            thread.join()
        
        print("并发日志记录测试完成")
        
        # 检查日志文件是否存在
        if os.path.exists(log_file):
            with open(log_file, 'r', encoding='utf-8') as f:
                content = f.read()
                print("日志文件内容:")
                print(content)
                # 检查是否包含所有线程的消息
                for i in range(3):
                    if f"线程 {i+1}" in content:
                        print(f"✓ 包含线程 {i+1} 的消息")
        
        # 测试多实例唯一文件名功能
        print("\n测试多实例唯一文件名功能:")
        logger1 = LogUtils.create_unique_file_logger("instance1", log_file)
        logger1.info("实例1的消息")
        
        time.sleep(1)  # 确保时间戳不同
        
        logger2 = LogUtils.create_unique_file_logger("instance2", log_file)
        logger2.info("实例2的消息")
        
        # 获取两个实例的实际日志文件
        handlers1 = logger1.logger.handlers
        handlers2 = logger2.logger.handlers
        
        actual_file1 = None
        actual_file2 = None
        
        for handler in handlers1:
            if hasattr(handler, 'baseFilename'):
                actual_file1 = handler.baseFilename
                break
                
        for handler in handlers2:
            if hasattr(handler, 'baseFilename'):
                actual_file2 = handler.baseFilename
                break
        
        if actual_file1 and actual_file2:
            print(f"实例1日志文件: {os.path.basename(actual_file1)}")
            print(f"实例2日志文件: {os.path.basename(actual_file2)}")
            
            # 验证文件名不同
            if actual_file1 != actual_file2:
                print("✓ 两个实例使用了不同的日志文件，避免了冲突")
            else:
                print("✗ 两个实例使用了相同的日志文件")
        
    finally:
        # 清理（可能需要稍等一下让文件句柄释放）
        time.sleep(0.1)
        for item in os.listdir(temp_dir):
            item_path = os.path.join(temp_dir, item)
            try:
                os.remove(item_path)
            except:
                pass
        os.rmdir(temp_dir)
        print(f"已清理临时目录: {temp_dir}")


if __name__ == "__main__":
    test_concurrent_logging()
    print("所有测试完成!")